package com.findyou.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @Title: JavaConfiguration
 * @Author 贾金博
 * @Package com.findyou.config
 * @description: java的配置类去代替xml
 *
 * 1: 包扫描配置
 * 2: 引用外部的配置文件
 * 3: 声明第三方依赖的bean组件
 *
 * 步骤1: 添加 @Configuration表示我们是配置类
 * 步骤2: 实现上面的三个功能注解
 */
// 包扫描 要是多个包的话 用集合的形式 { , } 逗号隔开
@ComponentScan(value = "com.findyou.ioc_01") // 一个属性的时候 value是可以省略的 要是value里面有多个包的话 用 {} 里面用 逗号隔开 "{, , , , }"
@PropertySource(value = "classpath:jdbc.properties") // 外部的资源 配置文件的引入
@Configuration // 我这个是配置类
public class JavaConfiguration {
    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;


    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON) // 默认是单例的
    @Bean(name = "dataSource")
    public DruidDataSource dataSource() { //之前这个也是写在 配置的xml文件里面的
        // 实现具体的实例化过程
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "dataSource2")
    public DruidDataSource dataSource2() { //之前这个也是写在 配置的xml文件里面的
        // 实现具体的实例化过程
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();

        jdbcTemplate.setDataSource(dataSource); // 他是去上ioc容器里面去取的 也就是自动注入的
        return jdbcTemplate;
    }
}
